import tensorflow as tf
import numpy as np

print(tf.__version__)

# tensor 一般分为常量与变量
# 常量表示值和维度是不变的
# 变量定义之后值可变但是维度不可变

""" 神经网络汇总，变量Tensor 一般可以作为储存权重和其他信息的矩阵，是可以训练的数据模型
 而常量tensor 可以作为储存超参数 或者其他结构的信息变量 """

""" 创建常量 """
tf.constant()
""" 参数按照顺序如下
value 值
dtype 数据类型
shape 张量形状
name 常量名称
verify_shape 布尔类型 用于验证值得形状默认是fals，如果=true则校验value与shape是否相符，不符报错
"""
const_a = tf.constant([[1,2,3,4]],shape=[2,2],dtype=tf.float32)
const_a
print("常量const_a的数值为：",const_a.numpy())
print("常量const_a的数据类型：",const_a.dtype)
print("常量const_a的数据形状:",const_a.shape)
print("常量const_a的设备：",const_a.device)



# 创建全零的
tf.zeros()
"""
shape 张量形状
dtype 类型
name 名称
"""
zeros_b = tf.zeros(shape=[2,3],dtype=tf.int32)

tf.zeros_like()
"""
input_tensor 张量
dtype 类型
name 名称
optimize 优化
"""
zeros_like_c = tf.zeros_like(const_a)

# 创建全都是1 具体操作同上不做演示了
tf.ones()
tf.ones_like()

# 创建自定义数值的
tf.fill()
"""
dims 张量形状同之前的shape
value 张量的数值
name 名称
"""
fill_d = tf.fill([3, 3], 8)



# 创建已知分布的
tf.random()
"""
用于产生具体分布的张量。该模块中常用的方法包括 均匀分布：uniform()  正态分布：normal() 随机分布 shuffle() 
例子为创建一个符合正太分布的张量
shape 数据形状
mean 高斯分布均值
stddev 高斯分布标准差
dtype 数据类型
seed 随机种子
name 名称
"""
random_e = tf.random.normal([5, 5], mean=0, stddev=1.0)




# 将numpy，list转换成tensor
tf.convert_to_tensor()
"""
value 需转换的数值
dtype 张量数据类型
dtype_hint 返回张量的可选元素类型，当dtype为None，在某种情况下调用者在转换时没考虑dtype，因此dtype_hint可以用作首选项
"""
list_f = [1, 2, 3, 4, 5, 6]
type(list_f)

tensor_f = tf.convert_to_tensor(list_f,dtype=tf.float32)

""" 创建变量tensor """
# 创建的值可以通过在其上运行算术运算更改，可读取和修改变量值
tf.Variable()


var_1 = tf.Variable(tf.ones([2, 3]))
print("变量var_1的数值：", var_1.read_value())
var_value_1 = [[1, 2, 3], [4, 5, 6]]
var_1.assign(var_value_1)

print("变量var_1赋值后的数值：", var_1.read_value())

"""加减法"""
var_1.assign_add(tf.ones([2, 3]))